javascript - 通过 websockets 发送和接收颜色数组的最佳方式

标签 javascript c++ c

我需要控制很多 LED(为了好玩……不是工作)。

UI用 javascript 编写,每秒发送数据(颜色数组)大约 60 次。

led 驱动器是一个微 Controller ( ESP8266 ),使用 websocket library 在 c++ 中编程。使用 arduino IDE

LED 可寻址并通过单个引脚控制。关于数据传输 btw led 和微 Controller 的更多信息可以在 this 中阅读数据表。但我使用的是简化的 library驱动那些使用 i2s 的人所以 DMA 将 CPU 排除在外。

目前我正在向第一个 LED 发送一种颜色。颜色被转换为十六进制字符串以节省空间。

客户端

//javascript
websocket.send('#ff0000');

服务器

//c++
if(payload[0]=='#'){
 uint32_t rgb = (uint32_t) strtol((const char *) &payload[1], NULL, 16);
 pixels[1].R=((rgb >> 16) & 0xFF);
 pixels[1].G=((rgb >> 8) & 0xFF);
 pixels[1].B=((rgb >> 0) & 0xFF);
}

我的第一个猜测是发送一个像字符串一样的“十六进制”然后拆分它

"#ff0000ff0000ff0000"
//or
"#ff0000#ff0000#ff0000"

但我去聊天并收集了有关此问题的更多信息。人们建议我使用二进制或 ascii。这对我来说有点难,所以我需要一些例子。特别是对于 c++ 部分。我什至不确定 websocket 库是否能够正确处理 ascii 或二进制,然后将其重新转换回数字。

问题:

微 Controller 有各种限制。尤其是内存,还有传输速度和转换数据所需的时间。 最终颜色数组的字节数应该很小并且易于重新转换为 rgb 值。

发送和接收颜色数组的正确方法是什么?


各种库的选择是长期的研究:

  • Arduino IDE:该芯片易于使用。大社区。
  • Arduino esp8266 Websocket 库:显然是基于 Arduino IDE 的最快的库。
  • ws2812b i2s:它使用 DMA 控制 LED,因此没有 CPU。
  • JS 作为 UI:它适用于所有移动设备。免费。
  • websockets:双向实时数据传输。它适用于所有移动设备。免费。

最佳答案

所有功劳归功于 enhzflep

我只是把它留在这里以记住它是如何工作的。

不需要 String.fromCharCode(),因为它是一个 Uint8Array,因此只需添加从 0 到 255 的单个颜色范围

要通过 websocket 发送二进制数据,只需传递 Uint8Array。缓冲区

javascript

创建并发送一个包含 16 个红色像素的数组。

var pixels=16,
a=new Uint8Array(pixels*3),
l=pixels*1;
while(l--){
 a[l*3]=255;//red
 a[l*3+1]=0;//green
 a[l*3+2]=0;//blue
}
ws.send(a.buffer);

C++

使用 i2s lib 设置接收到的负载中的所有像素和 ws lib

case WStype_BIN:
 uint8_t l=NUM_LEDS*1;
 while(l--){
  pixels[l].R=payload[l*3];
  pixels[l].G=payload[l*3+1];
  pixels[l].B=payload[l*3+2];
 }
 ledstrip.show(pixels);
break;

代码现在运行了一个多小时,没有任何卡顿,每 15 毫秒无线更新 16 个 LED。

对于所有其他代码/库,我在最多 15 分钟后出现内存和其他问题。使用一个 LED。

所以...谢谢enhzflep。

关于javascript - 通过 websockets 发送和接收颜色数组的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34741704/

相关文章:

javascript - $filter ('date' ) 在 Controller 中使用 $scope 变量作为格式时不更新格式

c++ - 反汇编中的引用类型和指针

c++ - cpp 映射作为函数参数获取警告信息 "discards qualifiers"

c - 在 C 中使用定界符拆分字符串 - 段错误

javascript - Google Chrome webkit 通知撤销权限?切换开/关?

javascript - 有什么理由继续使用 var 吗?

c# - 在 Mac 应用程序中托管嵌入的 Chromium

c - 指向结构中 char 的灵活指针数组

c - 尝试终止一个字符数组并在之后打印

javascript - iPhone 上的 Knockout.js 问题 - 下拉列表问题