基于树莓派和Node的物联网设备开发

公司一直智能饮水这个行业进行研发,前一段时间接到需求,厂商希望能在饮水设备上进行广告投放,并能通地触屏控制饮水机。公司选择了使用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代码

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

编辑于 2017-06-07

文章被以下专栏收录