基于树莓派和Node的物联网设备开发
发布于 2 天前 作者 zouzhenxing 429 次浏览 来自 分享

从知乎复制过来就乱了。。。。。 传送门

公司一直智能饮水这个行业进行研发,前一段时间接到需求,厂商希望能在饮水设备上进行广告投放,并能通地触屏控制饮水机。公司选择了使用Android智能板来开发这套程序,在开发过程中,由于公司在Android这块的技术力量不够强大。所以让我试验一下Liunx + NodeJs这个方案(公司主要技术都在NodeJs这方面)。在试验的过程中,我遇到了很多的问题和挑战,最终得到了一个可行的方案,特此记录,方便以后学习。 开发平台选择 我需要选择一款Liunx开发板,这块板需要支持联网、串口通信、有扩展接口,能播发视频和较强的处理能力。综合考虑我选择了树莓派3B这块板,这块板有1.2G 4核CPU,1G内存,并拥有GPU,4个USB口,40针GPIO口,带有WIFI和蓝牙,有较强的扩展性和可编程性。同时树莓派拥有成熟的社区和系统。于是购买设备如下图:

7’触屏

树莓派3主板一块

5V2A电源

HDMI连接线

USB供电线

PL2303串口转USB口线一条

开发完成的结果如下图所示

系统安装 系统我选择了官方最新的raspbian系统,安装过程比较简单,这里简要介绍下。

先使用SDFormatter.exe将micro卡进行格式化,当然你需一个读卡器,再使用Win32DiskImager.exe将下载好的系统写入到卡中。这个过程网上有很多讲解,我就不详述。要注意的是micro卡一定要选择一个好的,别贪便宜。我买树莓派时商家送了我一个16G的卡,使用这个卡做系统时,老是出莫明其妙的问题,而且写入速度非常慢。后来我使用自己的一个8G卡,一切OK。

系统启动后,连接WIFI,最好设备一个固定的IP,以免每次重启都要重新找IP。打开SSH连接端口。

设置后重启就可以通过putty连接到树莓派了。

配置root用户 使用pi用户连接到树莓派并打开root用户,PI用户的默认密码是raspbian,

sudo passwd 密码 // 修改pi密码 sudo passwd root // 修改root密码 sudo passwd --unlock root // root用户默认为锁定状态 需要解销 解锁完之后就能使用root用户登录了吗?还不行,不要执行下面一步,非常重要

sudo nano /etc/ssh/sshd_config 重启后就可以使用root用户登录了

Node安装与chromium browser配置 树莓派使用的ARM结构的CPU,所以安装下载ARMv7的node解压即可使用。

安装node

// path是你下载的目录 xz -d path tar -xvf path ln -s path/bin/node /usr/bin/node // 不知道如何解释,相当于window的快键方式 ln -s path/bin/npm /usr/bin/node npm config set registry https://registry.npm.taobao.org // 淘宝镜像 安装好node之后,编写一个web服务,让系统一启动就全屏打开chromium。

如何快速编写web服务,请参考我以前的文章

整合Express + Mysql + mocha,自动生成代码 设置开机启动chromium

cd /home/pi/.config // 进入PI用户的config目录 mkdir autostart cd autostart sudo nano my.desktop 写如下图所示内容

原理是:GUI启动后,会自动去运行autostart下面的*.desktop文件,相当于window的启动文件夹。需要说明的是 -kiosk 这个启动属性,称为超级全屏模式,打开后只能通过键盘按Ctrl + F4退出。这样就达到图二的效果了。

为了显示美观我们还必须做四件事。

一,关闭自动休眠

sudo vim /etc/profile.d/screen.sh xset dpms 0 0 0 xset s off

sudo nano /etc/lightdm/lightdm.conf 增加一行:xserver-command=X -s 0 dpms 二,隐藏掉鼠标图标

sudo apt-get install x11-xserver-utils unclutter 三,自动启动web服务

pm2 save pm2 startup 四,关闭chromium恢复页面

sed -i ‘s/exited_cleanly":\ false/exited_cleanly":\ true/g’ /home/pi/.config/chromium/Default/Preferences 这条命令不完全起作用,在非正常情况下重启后,chromium还是显示恢复提示,让我十分烦恼。各位如果有更好的解决办法,请告知我一下,十分感谢。

串口通信 大家可以看到页面有饮水机的状态,包括热水,冷水等信息。这些信息是饮水机的控制板通过串口进行传输的,所以串口的开发非常重要。我使用SerialPort这个node包来实现node对串口的通信。

// 由于SerialPort是调用c/c++代码,所以要进行编译,先安装node-pre-gyp sudo npm install node-pre-gyp --save // 一定要使用这个命令,在serialport git上有说明 sudo npm install serialport --unsafe-perm --build-from-source --save // 然后等待编译完成 const SerialPort = require(‘serialport’); global.serialPort = new SerialPort(’/dev/ttyAMA0’, { baudrate: 38400, autoOpen: false }); const protocol14 = require(rootPath.concat(’/service/protocol14.js’));

serialPort.open(function (error) { if (error) { logger.error(‘串口打开失败’, error); return; } logger.error(‘串口打开成功’);

serialPort.on(‘data’, (data) => { // 校验crc并初步解析数据 const result = util.parseResult(data);

// crc校验失败
if(result === -1) {
  serialPort.write(util.crcerror());
  return;
}

// protocol14.parseData(result);
console.log(data);

});

serialPort.on(‘error’, (error) => { logger.error(‘串口报错’, error); }); serialPort.on(‘disconnect’, () => { logger.error(‘串口报错连接关闭’); global.serialPort = null; }); serialPort.on(‘close’, () => { logger.error(‘串口报错连接断开’); global.serialPort = null; }); }); 编写上述代码,即可进行串口通信。如何测试?这时,我们买的PL2303线就起到作了,按下图所示接入:个共4条线,电源,接地,TXD,RXD,如果不供电,不要插电源线(切记,别烧板了)

接好之后,在电脑上使用串口助手发送数据,得到响应,但代码并没有收信息,怎么回事?到树莓派论坛查了查,原来PI3的串口被蓝牙占用了。蓝牙模块在这个项目没有用,所以把安关闭掉 就行了。步骤如下

下载 disable pi3 bt overlay文件: pi3-disable-bt-overlay.dts 放到 /boot/overlays 下 sudo nano /boot/config.txt //下面这行加在 config.txt文件最后, dtoverlay=pi3-disable-bt //进入linux后,屏蔽蓝牙功能 sudo systemctl disable hciuart

// 修改/boot/cmdline.txt文件 sudo /boot/cmdline.txt dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

// 重启 sudo reboot 测试,成功通信

总结 回顾起来好像也不是很麻烦,但这个过程我断断续续的花了一个星期才完成,收获良多。

虽然在树莓派上基于浏览器也可以开发类似于Android的程序,但也有很多的问题:

1、在浏览器上播放视频,CPU占用较高,至少是20%。这里必须把GPU的共享内存设置为128M以上,否则会卡顿。

2、插卡式的存储,十分不稳定

3、相比于Android来说,浏览器的用户体验不友好,没有虚似键盘。(后面做了一个JS的虚似键盘)

当然,也有优势

1、基于浏览器是一个开放式的平台,可以方便的开发。

2、可以复用公司web代码

当然,任何技术方案都是根据公司的情况进行取舍

6 回复

Liunx ==> Linux

一直想学物联网方面的东西,从前端不知道如何下手

@467658159 可以先学习linux系统

@zouzhenxing Linux在研究node的同时也在学习,不过没有方向啊,不知道该学哪些东西。我本身大学学的是测控,对硬件什么的有点了解,可是都忘得差不多了。 还有网上说javascript成为物联网主流编程语言是真的吗?我看有些排行java还是排在第一的啊

回到顶部