8266利用网页JS 代计算,特殊方式扩展8266性能
文章目录
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,
消耗的用户电脑/手机的性能.云分发!!!!
代码