8266的板子默认只有80MHZ很难实现一些复杂运算.然后我就想了这个用网页JS代8266计算的办法.用于一些比较特殊的场景.

改变传统上下位机角色

 

原来是你发一个指令,让板子给你算结果.

要么就是你直接算好,传给板子. arduino的上位机一般都是算好之后,传给arduino,比如我之前折腾的雕刻机.雕刻机上位机解析GCODE,然后将GCODE解析后传给板子.板子根据G指令一步一个操作.

 

 

而现在不一样:

8266想要计算一个东西,但是它不自己计算,它提交一个公式给上位机,让上位机算好之后再返回给8266自己.

 

我这里说的就是8266作为下位机提供公式 . 网页/js充当上位机计算. 角色没变,只是主动和被动变了.

 

 

实现原理

注意,我这里只是我写的demo的方式.

方式可以改变.

不要拘泥网页JS计算不放.你可以任何连接8266的设备,

 

串口也是可有可无,我这里串口输入是为了更好测试,运算效率.

 

1,8266板子通电,当一个小web服务器/websocket服务器

2,用户打开这个web服务器,通过js自动连接到websocket服务器. 

3,用户在串口发送一个运算指令.8266将这个指令发送到网页.

4,网页JS通过websocket接受到运算指令,计算并返回给板子.

 

场景

 

说实话这个方案感觉高大上,但是这个东西还是有点鸡肋.

不过一些特殊场景还是有点用的.

 

扩展8266运算

计算1+2+3...150万 在不超频的情况下需要2.6秒

超频的情况下也要1秒多.

 

再高就不行了,会爆栈.无法计算.板子自动重启.如果爆栈的计算在setup函数里面,可能无限重启.

 

算阶乘,只能算到32! 再高也得爆栈.

算到是很快,毕竟算32次就够了.

 

测试代码,计算1+2+3+....150万

unsigned long time1; 
unsigned long time2;
unsigned long time3;
 double n = 1500000.0;

void setup() {
  // put your setup code here, to run once:


Serial.begin(115200);

//Serial.print("Time2:");
Serial.println("run ");
Serial.print("Time1:");
time1 = millis();

Serial.println(String(" ") + time1);
    unsigned long i;
    double sum=1.0;

    for(i=1;i<=n;i++){
      sum=sum+i;

      }


        String str_sum =String(" ") + sum;
Serial.printf("sum(%lf)=",n);
//Serial.println(sum);
  Serial.println(str_sum);      

Serial.print("Time2:");
time2 = millis();

Serial.println(String(" ") + time2); 


Serial.print("all Time:"); 

  time3 = time2-time1;
Serial.println(String(" ") + time3);   
}

void loop() {
  // put your main code here, to run repeatedly:

}

 

算阶乘只需要将上面代码 加法变成除法.

 

 

实际上简单的运算不会比你8266直接算快多少,因为ws传输也是需要时间的.

 

不过重要的是,它能提高你运算能力,在大数计算方面尤为的感觉到.

 

8266自己算阶乘只能算到32!,超过就会爆栈..无法计算.

下面是利用网页js代计算 120! 阶乘,传输+运算需要0.049秒. 如果8266不爆栈可能大概也不会超过这个时间太多. 利用网页JS计算相当于你8位机马上变成64位机了.扩展了精度.运算能力.

 

 

 

代加密

 

这是我即将准备干的事情,比如我做好一个固件,让用户烧录.(可能并不开源).

固件是自动接入我的服务器.

为了省掉一些用户操作环境,固件就在代码中自动接入我服务器.

 

这时候就需要传入硬件唯一ID.

为了防止伪造,

你得将数据加密.保证用户传入的内容是合法的.

当然你服务器收到数据后,你还得校验加密值,防止用户在传输途径修改.

 

8266因为运算有限,加密计算非常慢,计算会不会爆栈还两说.

 

所以,利用用户的设备代计算,就有一点点用拉.

下面是我测试RSA 公钥加密(对应私钥1024位),运算+ws传输时间,总的只需要0.028秒就得出结果.

 

应用场景

 

还是觉得一般用户用不上这个东西,可能意义不大.

一般就是商家,做固件,下面用户通过设备接入他服务器.

 

比如首次使用需要绑定.

为了防止用户修改自己设备,那么需要做下加密.再传服务器上.

如果直接将数据直传,那么数据容易被修改.用户可能自己就是一个坏角色.

 

8266和UNO更适合这个场景是因为他支持网络,可以远程控制.它使得这种方案变成可能.

 

用户通过一般就是/网页/app/微信小程序访问自己设备.

网页/app 这些部分代码也是商家的,

商家把部分运算移到网页/用户app上面去.这样不消耗自己服务器,也不吃板子的CPU,

消耗的用户电脑/手机的性能.云分发!!!!

 

代码

 

 

https://github.com/Y-A-K-E/8266_ws_js_math