月別アーカイブ: 2015年10月

[raspberry pi]SSMTPによるメール送信

raspberry piからプロバイダのSMTPサーバーを用いて送信する。

1. 必要なアプリをインストール
sudo apt-get install ssmtp
sudo apt-get install mailutil

2. SSMTPの設定
sudo vi /etc/ssmtp/ssmtp.conf

#プロバイダの設定情報により
root=xxx@xxx.xxx.xxx.xxx #契約しているメールアドレス。これがないと弾かれることがある 
mailhub=smtp.xxx.xxx:xxx #SMTPサーバーのアドレス
AuthUser=メールユーザID
AuthPass=メールパスワード
AuthMethod=LOGIN
UseSTARTTS=YES
#UseTLS=YES

rewriteDomain=hiroshi-no.raspberry.com #送信者として表示されるドメイン

3. メール送信 mailコマンド 本文を書き終えたあとcommand+dでEOFとなる
mail xxx@xxx.xxx.xxx.xxx
subject:test
test
EOF

BME280のサンプルコード実行とI2Cの設定[raspberry pi]

BME280というデジタルセンサについて


1. /boot/config.txt の末尾に dtparam=i2c_arm=on を加える
2. /etc/modules の末尾に i2c-dev を加える
3. 再起動 sudo shutdown -r now
4. lsmodにより i2c_bcm2708 と i2c_dev があることを確認
5. sudo apt-get install i2c-tools
6. sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — —
10: — — — — — — — — — — — — — — — —
20: — — — — — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — — — — — — — — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — 76 —

BME280をつないだときは0x76を用いていることがわかる


1. サンプルコードのダウンロード
wget https://raw.githubusercontent.com/SWITCHSCIENCE/BME280/master/Python27/bme280_sample.py
2. sudo apt-get install python-smbus
3. sudo python bme280_sample.py
temp : 27.33 ℃
pressure : 1012.68 hPa
hum : 46.24 %

シリアル通信[arduino,C#]

arduinoのLEDをUSBシリアル通信でC#により点灯させる。
USBのCOMポートはデバイスマネージャーとかから確認。
arduino側は’H’の文字を受けると1秒間13ピンをHIGHにする。

[arduino]
const int LED=13;
void setup() {
pinMode(LED,OUTPUT);
Serial.begin(9600);
}

void loop() {
//シリアル通信のバッファに何か入ったら読み込む
if(Serial.available()>0){ //2文字以上の場合は>2とかでforで格納
char c = Serial.read();
if(c == ‘H’){
digitalWrite(LED,HIGH);
delay(1000);
digitalWrite(LED,LOW);
}else if(c == ‘L’){
digitalWrite(LED,LOW);
delay(1000);
}
}
}

[C#]
using System.IO.Ports

SerialPort mySerialPort = new SerialPort(“COM1”);
mySerialPort.BaudRate = 9600;
mySerialPort.Open();
mySerialPort.Write(“H”);
mySerialPort.Close();

最初に行うあれこれ[raspberry pi]

raspberry pi2 model Bにて

[sshでログイン]
①本体LAN接続後、ルータかサーバーにてraspberry piのIPを調べsshでログイン
ssh pi@xxx.xxx.xxx.xxx
pasword:raspberry

[固定IPの割当]
ルータ側にIPを登録してあること!
vi /etc/network/interfaces

auto eth0
allow-hotplug eth0
iface eth0 inet manual

の部分を以下に書き換える

iface eth0 inet static
address xxx.xxx.xxx.xxx
netmask 255.255.255.0
gateway xxx.xxx.xxx.xxx

②ネットワークインターフェースの再起動
sudo ifdown eth0
sudo ifup ether

[無線LANの設定]
①USB無線アダプタを差し込んでlsusbで認識していることを確認。

②sudo iwlist wlan0 scan
で利用可能なアクセスポイントの情報を得る。暗号化方式や規格などを確認。

③sudo vi /etc/wpa_supplicant/wpa_supplicant.confにて以下を付け足す
network={
ssid=”SSID”
psk=”PWD”
proto=WPA2
key_mgmt=WPA-PSK
pairwise=CCMP
group=CCMP
#priority=2
#scan_ssid=1  #ステルスssidの場合1
}

④sudo vi /etc/network/interfacesにて以下を編集。以下は固定IPの場合。
※ネットマスクが適切でなくて繋がらないことがあった
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
address xxx.xxx.xxx.xxx
netmask 255.255.255.0
gateway xxx.xxx.xxx.xxx
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

⑤インターフェースの再起動
sudo ifdown wlan0
sudo ifup wlan0

⑥dhclient wlan0で動的インターフェースを割当直す

⑥本体を再起動して有線LANを外してpingを試す

[get-apt]
sudo apt-get update

プロキシを通す場合
sudo http_proxy=http://xxx.xxx.xxx.xxx:xxxx apt-get update

[webサーバー]
①apache,php,mysqlのインストール
sudo apt-get install apatche2
sudo apt-get install php5
sudo apt-get install mysql-server
sudo apt-get install php5-mysql php5-curl

②とりあえずserviceコマンドで扱うと楽
service apache2 status
service apache2 start
service apache2 stop

③ブラウザからラズパイのIPで開くと”It works”となる
index.htmlの場所は/var/www

[電源を切る]
sudo shutdown -h now

[バックアップ]
[cygwinにて]
①SDカードを差し込みdfにて認識と容量を確認
②デバイスがsdbであることをls /dev/より確認
②dd if=/dev/sdb of=./rasp.bk.img
※16Gで40〜50分かかった

[macにて]
①SDカードを差し込みdiskutil listで認識と容量を確認
②デバイスがdisk1とかであるかを確認
③sudo dd bs=1m if=/dev/rdisk1 of=~/rasp_bk.img

[タイムゾーン]
sudo dpkg-reconfigure tzdataからAsia Tokyoに設定

[時刻]
1. $ sudo vi /etc/ntp.conf
server~あたりをコメントアウト
pool ntp.nict.jp iburstを追記
2. $ sudo service ntp restart

ソケット通信[C++]

TCPソケット通信を行う必要があったので拾ったC++のコードを修正して試してみた。
よく調べもせず余分なものまでincludeしているが、macでもcygwinでもgccでコンパイルできた。
クライアント側にはサーバー側のIPを設定し、サーバー側を実行してからクライアント側を実行するとクライアント側がサーバー側から返された文字を出力する。

[クライアント側]

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{
struct sockaddr_in server;
int sock;
char buf[32];
int n;

/* ソケットの作成 */
sock = socket(AF_INET, SOCK_STREAM, 0);

/* 接続先指定用構造体の準備 */
server.sin_family = AF_INET;
server.sin_port = htons(12345);
server.sin_addr.s_addr = inet_addr("172.16.200.19");

/* サーバに接続 */
connect(sock, (struct sockaddr *)&server, sizeof(server));

/* サーバからデータを受信 */
memset(buf, 0, sizeof(buf));
n = read(sock, buf, sizeof(buf));

printf("%d, %s\n", n, buf);

/* socketの終了 */
close(sock);

return 0;
}

 

[サーバー側]

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{
int sock0;
struct sockaddr_in addr;
struct sockaddr_in client;
socklen_t len;
int sock;

/* ソケットの作成 */
sock0 = socket(AF_INET, SOCK_STREAM, 0);

/* ソケットの設定 */
addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_len = sizeof(addr);

bind(sock0, (struct sockaddr *)&addr, sizeof(addr));

/* TCPクライアントからの接続要求を待てる状態にする */
listen(sock0, 5);

/* TCPクライアントからの接続要求を受け付ける */
len = sizeof(client);
sock = accept(sock0, (struct sockaddr *)&client, &len);

/* write(ソケット,"文字",文字数) */
write(sock, "HELLO from mac01", 16);

/* TCPセッションの終了 */
close(sock);

/* listen するsocketの終了 */
close(sock0);

return 0;

}

 

plistの編集

1.Xcodeを使う
2.plutilというコマンドを使う

Xcodeでは権限がないと編集できない
ターミナルで権限を与えてから編集するのであれば、最初からターミナルで行った方が容易だろう。

lion以降からplistファイルがバイナリらしいが、
plutil -convert xml1 temp.plist という風にXMLとかに変換が可能。