ラズパイでTrackrr.ioに位置情報を表示してみた(2)

[前回](http://qiita.com/YusukeHasegawa/items/01cb967ab58a02c0978c)からの続きです。
GPSモジュールをゲットしたのでラズパイに接続して、モジュールからの位置情報を表示できるようにしてみます。

![IMG_2127.JPG](https://qiita-image-store.s3.amazonaws.com/0/132516/16b4cff8-e0e6-c750-1a6a-3e38a754a79f.jpeg)


#GPSを接続してみる
##接続前
```shell-session:lsusb
pi@raspberrypi:~/trackrr.io-sdk-js-sample$ lsusb
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. LAN9500 Ethernet 10/100 Adapter / SMSC9512/9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```
```shell-session:ls&nbsp;/dev/tty*
pi@raspberrypi:~/trackrr.io-sdk-js-sample$ ls /dev/tty*
/dev/tty    /dev/tty13  /dev/tty19  /dev/tty24  /dev/tty3   /dev/tty35  /dev/tty40  /dev/tty46  /dev/tty51  /dev/tty57  /dev/tty62    /dev/ttyprintk
/dev/tty0   /dev/tty14  /dev/tty2   /dev/tty25  /dev/tty30  /dev/tty36  /dev/tty41  /dev/tty47  /dev/tty52  /dev/tty58  /dev/tty63
/dev/tty1   /dev/tty15  /dev/tty20  /dev/tty26  /dev/tty31  /dev/tty37  /dev/tty42  /dev/tty48  /dev/tty53  /dev/tty59  /dev/tty7
/dev/tty10  /dev/tty16  /dev/tty21  /dev/tty27  /dev/tty32  /dev/tty38  /dev/tty43  /dev/tty49  /dev/tty54  /dev/tty6   /dev/tty8
/dev/tty11  /dev/tty17  /dev/tty22  /dev/tty28  /dev/tty33  /dev/tty39  /dev/tty44  /dev/tty5   /dev/tty55  /dev/tty60  /dev/tty9
/dev/tty12  /dev/tty18  /dev/tty23  /dev/tty29  /dev/tty34  /dev/tty4   /dev/tty45  /dev/tty50  /dev/tty56  /dev/tty61  /dev/ttyAMA0
```
##接続後
```shell-session:lsusb
pi@raspberrypi:~/trackrr.io-sdk-js-sample$ lsusb
Bus 001 Device 007: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. LAN9500 Ethernet 10/100 Adapter / SMSC9512/9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```
`PL2303 Serial Port`が増えてますね。

```shell-session:ls&nbsp;/dev/tty*
pi@raspberrypi:~/trackrr.io-sdk-js-sample$ ls /dev/tty*
/dev/tty    /dev/tty13  /dev/tty19  /dev/tty24  /dev/tty3   /dev/tty35  /dev/tty40  /dev/tty46  /dev/tty51  /dev/tty57  /dev/tty62    /dev/ttyUSB0
/dev/tty0   /dev/tty14  /dev/tty2   /dev/tty25  /dev/tty30  /dev/tty36  /dev/tty41  /dev/tty47  /dev/tty52  /dev/tty58  /dev/tty63    /dev/ttyprintk
/dev/tty1   /dev/tty15  /dev/tty20  /dev/tty26  /dev/tty31  /dev/tty37  /dev/tty42  /dev/tty48  /dev/tty53  /dev/tty59  /dev/tty7
/dev/tty10  /dev/tty16  /dev/tty21  /dev/tty27  /dev/tty32  /dev/tty38  /dev/tty43  /dev/tty49  /dev/tty54  /dev/tty6   /dev/tty8
/dev/tty11  /dev/tty17  /dev/tty22  /dev/tty28  /dev/tty33  /dev/tty39  /dev/tty44  /dev/tty5   /dev/tty55  /dev/tty60  /dev/tty9
/dev/tty12  /dev/tty18  /dev/tty23  /dev/tty29  /dev/tty34  /dev/tty4   /dev/tty45  /dev/tty50  /dev/tty56  /dev/tty61  /dev/ttyAMA0
```
`/dev/ttyUSB0`が増えてますね。

正常に認識されたようです。

#シリアル通信してみる
```shell-session
pi@raspberrypi:~/trackrr.io-sdk-js-sample$ cu -s 4800 -l /dev/ttyUSB0
Connected.
$GPGGA,,,,,,0,00,,,M,0.0,M,,0000*48
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,,V,,,,,,,,,,N*53
$GPGGA,,,,,,0,00,,,M,0.0,M,,0000*48
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,,V,,,,,,,,,,N*53
$GPGGA,,,,,,0,00,,,M,0.0,M,,0000*48
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,3,1,12,01,00,000,,02,00,000,,03,00,000,,04,00,000,*7C
$GPGSV,3,2,12,05,00,000,,06,00,000,,07,00,000,,08,00,000,*77
$GPGSV,3,3,12,09,00,000,,10,00,000,,11,00,000,,12,00,000,*71
$GPRMC,,V,,,,,,,,,,N*53
$GPGGA,,,,,,0,00,,,M,0.0,M,,0000*48
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,,V,,,,,,,,,,N*53
$GPGGA,,,,,,0,00,,,M,0.0,M,,0000*48
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$G~PRMC,,V,,,,,,,,,,N*53
.

Disconnected.
```
お～来てますね。因みに終了は「`~.`」(チルダ　ピリオド)を入力です。

でも、緯度経度とれてなくね？空っぽですね・・。

どうやらずっと信号検索中ままで受信できてないみたいです。
>高感度受信機で、森林や都市部など上空が遮蔽された場所において性能を発揮します。

なんて書いてあるんですけどね。
社内で自席が一番窓際から遠いところにあり、厳しい感じなんですかね・・。

試行錯誤の結果、20mのLANケーブルをつなげて、なんとかラズパイを窓際に移動することに成功しました！
（移動作業を手伝ってくれた[ynott](http://qiita.com/ynott)さんありがとうござしましたｗ）

すると

```shell-session
pi@raspberrypi:~$ cu -s 4800 -l /dev/ttyUSB0
Connected.
$GPGGA,040557.249,3541.7314,N,13945.9898,E,1,04,5.6,40.8,M,39.4,M,,0000*6D
$GPGSA,A,3,01,07,30,28,,,,,,,,,8.8,5.6,6.8*30
$GPGSV,3,1,12,01,69,232,23,07,34,241,39,30,34,275,26,28,21,316,26*70
$GPGSV,3,2,12,22,30,156,18,27,25,076,20,09,64,315,,13,50,099,*79
$GPGSV,3,3,12,16,44,185,,03,13,174,,08,10,257,,04,05,297,*76
$GPRMC,040557.249,A,3541.7314,N,13945.9898,E,1.02,267.56,270716,,,A*6C
$GPGGA,040558.249,3541.7317,N,13945.9899,E,1,04,5.6,41.1,M,39.4,M,,0000*68
$GPGSA,A,3,01,07,30,28,,,,,,,,,8.8,5.6,6.8*30
$GPRMC,040558.249,A,3541.7317,N,13945.9899,E,1.17,267.53,270716,,,A*60
~$GPGGA,040559.249,3541.7316,N,.

Disconnected.
```
取れてるじゃないですか！

#コーディング

##そのまえに
Node.jsでシリアル通信できるNode Serialport、NMEA-0183フォーマットをパースするためにnode-nmeaをインストールします。

```shell-session
pi@raspberrypi:~/trackrr.io-sdk-js-sample$ npm install serialport nmea-0183 --save
npm WARN package.json trackrr.io-sdk-js-sample@1.0.0 No description
npm WARN package.json trackrr.io-sdk-js-sample@1.0.0 No repository field.
npm WARN package.json trackrr.io-sdk-js-sample@1.0.0 No README data
/
> serialport@4.0.1 install /home/pi/trackrr.io-sdk-js-sample/node_modules/serialport
> node-pre-gyp install --fallback-to-build

node-pre-gyp ERR! Tried to download: https://github.com/EmergingTechnologyAdvisors/node-serialport/releases/download/4.0.1/serialport-v4.0.1-node-v46-linux-arm.tar.gz
node-pre-gyp ERR! Pre-built binaries not found for serialport@4.0.1 and node@4.4.7 (node-v46 ABI) (falling back to source compile with node-gyp)
make: Entering directory '/home/pi/trackrr.io-sdk-js-sample/node_modules/serialport/build'
  CXX(target) Release/obj.target/serialport/src/serialport.o
  CXX(target) Release/obj.target/serialport/src/serialport_unix.o
  CXX(target) Release/obj.target/serialport/src/serialport_poller.o
  SOLINK_MODULE(target) Release/obj.target/serialport.node
  COPY Release/serialport.node
make: Leaving directory '/home/pi/trackrr.io-sdk-js-sample/node_modules/serialport/build'
nmea-0183@0.0.7 node_modules/nmea-0183

serialport@4.0.1 node_modules/serialport
tqq bindings@1.2.1
tqq es6-promise@3.2.1
tqq commander@2.9.0 (graceful-readlink@1.0.1)
tqq debug@2.2.0 (ms@0.7.1)
tqq nan@2.4.0
mqq object.assign@4.0.4 (function-bind@1.1.0, object-keys@1.0.11, define-properties@1.1.2)
```
##index.jsに処理を追加

```js:index.js
var trackrr = require('trackrr.io-sdk-js');
var gpsKey = 'Trackrr.ioで取得したGPSのキー';
var secret = 'Trackrr.ioで取得したアクセスキー';
var client = new trackrr.GpsClientManager(gpsKey, secret);

var serialport = require("serialport");
var nmea = require('nmea-0183');
var port = '/dev/ttyUSB0';
var baudrate = 4800;
var readline = '\r\n';

var receiver = new serialport(port, {
  baudrate: parseInt(baudrate),
  parser: serialport.parsers.readline(readline)
});

client.on('connect', () => {
        receiver.on('data', function(data) {
                var nmeaData = nmea.parse(data);
                if (nmeaData['id'] == 'GPRMC') {
                    var gps = {};
                    var coords = {};
                    gps.coords = {};
                    gps.coords.latitude = Number(nmeaData.latitude);
                    gps.coords.longitude = Number(nmeaData.longitude);
                    client.publish(gps);
                    console.log(gps);
                    console.log(nmeaData);
                }
        });
});
```
こんな感じになれば成功です。

```shell-session
pi@raspberrypi:~/trackrr.io-sdk-js-sample$ node index.js
{ coords: { latitude: 35.69557, longitude: 139.76688667 },
  identity: 'ap-northeast-1:XXXXX',
  gpsKey: 'XXXXX',
  createdDate: 1469676353018 }
{ id: 'GPRMC',
  time: '032552.000',
  valid: 'A',
  latitude: '35.69557000',
  longitude: '139.76688667',
  speed: 0,
  course: 94.96,
  date: '280716',
  mode: '',
  variation: NaN }
{ coords: { latitude: 35.69557, longitude: 139.76688667 },
  identity: 'ap-northeast-1:XXXXX',
  gpsKey: 'XXXXX',
  createdDate: 1469676353760 }
{ id: 'GPRMC',
  time: '032553.000',
  valid: 'A',
  latitude: '35.69557000',
  longitude: '139.76688667',
  speed: 0,
  course: 94.96,
  date: '280716',
  mode: '',
  variation: NaN }
{ coords: { latitude: 35.69557, longitude: 139.76688667 },
  identity: 'ap-northeast-1:XXXXX',
  gpsKey: 'XXXXX',
  createdDate: 1469676354536 }
{ id: 'GPRMC',
  time: '032554.000',
  valid: 'A',
  latitude: '35.69557000',
  longitude: '139.76688667',
  speed: 0,
  course: 94.96,
  date: '280716',
  mode: '',
  variation: NaN }
^C
pi@raspberrypi:~/trackrr.io-sdk-js-sample$
```

で、Trackrr.ioのコンソール画面では表示されてますね。
![image](https://qiita-image-store.s3.amazonaws.com/0/132516/4a3d9700-e3e8-b1b9-d3cb-570f05449046.png)

しかし、微動だにしないんで面白みに欠けますね。
次回は誰かのバッグに忍ばせてみることにします・・・。