Monday, January 11, 2016

Connect Mac/iPhone to a Simple Python Socket Server (Raspberry Pi Part)

This example shows a simple python socket server on a Raspberry Pi. A custom port is used instead of the HTTP port 80.

The server is tested at a remote Mac computer with:
1) telnet command
2) client python code
3) iOS app on simulator

Setup a socket server

1. Edit the server.py file on Raspberry Pi with this command:

sudo nano server.py

2. Edit and save the file as:

import socket

mysocket = socket.socket()
host = socket.gethostbyname(socket.getfqdn())
port = 9876

if host == "127.0.1.1":
    import commands
    host = commands.getoutput("hostname -I")
print "host = " + host

#Prevent socket.error: [Errno 98] Address already in use
mysocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

mysocket.bind((host, port))

mysocket.listen(5)

c, addr = mysocket.accept()

while True:

    data = c.recv(1024)
    data = data.replace("\r\n", '') #remove new line character
    inputStr = "Received " + data + " from " + addr[0]
    print inputStr
    c.send("Hello from Raspberry Pi!\nYou sent: " + data + "\nfrom: " + addr[0] + "\n")

    if data == "Quit": break

c.send("Server stopped\n")
print "Server stopped"
c.close()

3. Enable the server with this command:

python server.py

Results on a remote Mac computer


1) telnet command

1. Type this command to connect to Raspberry Pi:

telnet 192.168.xx.xx 9876

2. Type these strings:

this is mac
have a nice day
abcdefg
Quit



2) client python code


1. Edit a simple client.py file on Mac as:


import socket

server = socket.socket()
host = "192.168.xx.xx"
port = 9876

server.connect((host, port))
server.sendall("This is client")
print(server.recv(1024)) #Normal server response
server.sendall("Quit")
print(server.recv(1024)) #Quit server response

server.close()

2. Execute the client.py file on Mac terminal:

python client.py




3) iOS app on simulator

Create an iOS app with Swift. See this:
Connect Mac / iPhone to a Simple Python Socket Server (iOS Part)

And the result is:



References:
Connect iOS device to HTTP GET/POST PHP service (Raspberry Pi Part) (iOS Part)
Connect iOS device to MySQL database on a server (Raspberry Pi Part) (iOS Part)
Connect Mac/iPhone to a Simple Python Socket Server (iOS Part)
Sending an RSA encrypted message from client to Python socket server

Go back to Communication between iOS device (Client) and Raspberry Pi (Server)

Thursday, January 7, 2016

以SSH指令遠端存取樹莓派

樹莓派SSH (Secure Shell) 伺服器的預設值是啟動的。若要使用SSH遠端登入樹莓派,步驟如下:

1. 輸入 ifconfig 或是hostname -I 以取得樹莓派的IP address。

2. 如果要遠端使用的是Mac蘋果電腦,打開它的終端機Terminal:

Finder -> Applications -> Utilities -> Terminal

3. 在終端機中輸入這個指令:

ssh pi@192.168.x.x

並輸入密碼。


4. 要結束SSH連線時,輸入 exit



==================

如何關閉或開啟SSH server

1. 使用這個指令開啟軟體設定工具(software configuration tool):

sudo raspi-config

2. 選擇 8 Advanced Options


3. 選擇 A4 SSH


4. 選擇 disable或enable


5. 如果選擇了關閉 SSH server,使用這個指令將樹莓派重新開機:

sudo reboot

6. 如果 SSH server已關閉,使用先前的 ssh pi@192.168.x.x 終端機指令的結果是:


==========
English version of this post:
Remote access to Raspberry Pi using SSH terminal command

Tuesday, January 5, 2016

Raspberry Pi 樹莓派設定步驟

因為樹莓派(Raspberry Pi 2 Model B)太久沒用開不了機
重新記錄一下安裝設定的步驟,以免忘記:

1. 選購樹莓派並安裝Raspbian作業系統

2. 設定為美式鍵盤 (因為預設的英式鍵盤會有些問題)

3. 連上Wi-Fi網路

4. 輸入以下指令更新並升級:
sudo apt-get update
sudo apt-get upgrade

5. 設定日期時間

6. 如需遠端終端機存取,則使用SSH指令

7. 如需遠端桌面存取,則安裝VNC伺服器

8. 如需交換檔案,則安裝Samba伺服器

9. 安裝阿帕契Apache網頁伺服器

10. 安裝PHP 如何建立PHP檔案:PHP Basics

11. 安裝MySQL資料庫伺服器

注意: Linux + Apache + MySQL + PHP 一起稱為 LAMP

12. 設定中文作業環境:
Raspberry Pi 樹莓派的中文設定
在樹莓派上安裝中文字型
在樹莓派上使用免費的辦公室軟體 - LibreOffice

13. 視需求安裝Vim文字編輯器

14. 安裝FTP等其他Servers (未來再新增這部分)

How to use the vim text editor

1. Install vim with this command:

sudo apt-get install vim


2. Edit an HTML file with the commands below (Please ensure that Apache HTTP server has been installed.):

cd /var/www
sudo vim test.html

3. Type i or a or o to enter the insert mode.

4. Edit these:

<html>
<title>My Title</title>
<body>
<P>Edited by Vim.
</body>

</html>

5. Quit the insert mode with the Esc key.

6. Exit the vim editor and save the file with this command:

:wq

If you want to quit without saving:

:q!

Note: Hitting the Esc key to quit the insert mode is required before typing the : commands to exit vim.

7. Open the file from a remote browser:

Basic vim commands:

highlight one line - V
highlight area - v
copy - y
paste - p
undo - u
redo - Ctrl + r
search - /

Reference:
Editor War (Wikipedia)
如何使用vim文字編輯器(Chinese Version of this post)

Monday, January 4, 2016

如何設定樹莓派的Wi-Fi無線網路連線

本文使用的是Raspberry Pi 2 Model B
Raspberry Pi 3 的設定方式可能有所不同
因為已內建Wi-Fi
故不用選購Wi-Fi網卡

這篇文章是以Raspbian作業系統為例

若要以無線的方式將樹莓派連上網路
則需要一個USB網卡(WiFi dongle)
我所購買的是 EDUP EP-N8508GS

您也可參考相容的USB Wi-Fi adapter清單
或是向台灣樹莓派等店家購買


在終端機輸入 lsusb
成功偵測到 802.11n WLAN adapter

以下為英文的介面
選擇 Menu -> Preferences -> WiFi Configuration

選擇wpa_gui中的Manage Networks -> Scan 


選擇要連接的Wi-Fi熱點
按兩下滑鼠左鍵

接下來會出現以下的畫面
輸入密碼

選擇 Current Status -> Connect
如果像以下的畫面沒有連線成功
請檢查密碼

正確輸入密碼後
連線成功!
記住以下的IP address

在終端機輸入ifconfig
wlan0的IP位置應和之前 wpa_gui中的一樣

也可使用 hostname -I 指令

這樣就成功了
您可以打開樹莓派的Epiphany瀏覽器上網!

重新開機時也應可自動連上網

===============

這篇文章的英文版:
English Version of this Post:

Tuesday, December 29, 2015

Connect iOS device to MySQL database on a server (Raspberry Pi Part)

This post shows how to create a PHP+MySQL service on Raspberry Pi for iPhone / iPad to access using the HTTP POST method.

Raspberry Pi Part


1. Make sure that Apache, MySQL, PHP and phpMyAdmin have been installed.

2. Create some data in MySQL using phpMyAdmin or MySQL monitor commands.

3. Create the iosmysql.php file with this command:

sudo nano /var/www/iosmysql.php

4. Edit and save the file as below:                    

<?php

//check if database parameters are received correctly.
if (isset($_POST['username']) and isset($_POST['password']) and isset($_POST['tablename'])) {
$username = $_POST['username'];
$password = $_POST['password'];
$tablename = $_POST['tablename'];
} else {
    die("Wrong request");
}

$servername = "localhost";

//connect to database
$connection = mysql_connect($servername, $username, $password) or die("No MySQL Connection: " . mysql_error());

mysql_select_db("mydatabase", $connection) or die("<br>No Database: " . mysql_error());

$query = "select * from $tablename";
$result = mysql_query($query) or die("Query Error: " . mysql_error());

$FieldTotal = mysql_num_fields($result);

//loop through column names
for ($count = 0; $count < $FieldTotal; $count++) {
    $field = mysql_fetch_field($result, $count) or die("Field error!");    
    //Remove "fruit_" string, which includes $tablename and "_".
    $ShortTitle = substr($field->name, strlen($tablename)+1);
    print "$ShortTitle\t\t";
}
$RowTotal = mysql_num_rows($result);

//loop through rows
for ($RowCount = 0; $RowCount < $RowTotal; $RowCount++) {
    $row = mysql_fetch_row($result) or die("Row error!");
    print "\n";
    //loop through columns
    for ($ColCount = 0; $ColCount < $FieldTotal; $ColCount++) {
        print "$row[$ColCount]\t";
        if (strlen($row[$ColCount]) < 7) {
            print "\t";
        }
    }
}

?>

In this example, parameters obtained from the HTTP POST method are username, password, and tablename, while servername is set to "localhost" locally.


iOS Part

1. Write a simple iOS app. See this:


2. Test the iOS app. The result:


This result is the same as the result obtained using MySQL monitor commands on Raspberry Pi:


References:
PHP Manual
PHP Basics
Connect iOS device to HTTP GET/POST PHP service (Raspberry Pi Part) (iOS Part)
Access and show content of a database in MySQL with PHP

Friday, December 25, 2015

Setup HTTPS / SSL for Apache server

This post shows how to setup HTTPS (Hypertext Transfer Protocol Secure) / SSL (Secure Sockets Layer) with a Raspberry Pi.

1. Raspberry Pi Requirements:

Apache HTTP server installed

Custom domain name configured for Raspberry Pi's IP address on a Mac or Raspberry Pi.

You should have an HTTP server working like this:




2. Confirm if OpenSSL has been installed with this command:

sudo apt-get install openssl



3. Create certificate and key files:

sudo mkdir /etc/apache2/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -out /etc/apache2/ssl/server.crt -keyout /etc/apache2/ssl/server.key

where -x509 refers to the X.509 standard, while rsa:2048 refers to 2048-bit RSA cryptosystem (cryptographic algorithms).

You may replace 365 days by 1095 days for a longer period of three years.

Enter the the names of your country, state / province, locality, organization, organizational unit and common name as well as your email address.


4. Create a symbolic link:


sudo ln -s /etc/apache2/sites-available/default-ssl /etc/apache2/sites-enabled/000-default-ssl

5. Edit the SSL configuration file:

sudo nano /etc/apache2/sites-enabled/000-default-ssl

Type Ctrl+W to search for "SSLCer" and make sure:

SSLEngine on

and modify these file paths:

SSLCertificateFile    /etc/apache2/ssl/server.crt

SSLCertificateKeyFile /etc/apache2/ssl/server.key



6. Restart the Apache server:

sudo service apache2 restart

or

sudo /etc/init.d/apache2 restart


7. Open a browser from a computer. This example uses Firefox on a Mac. Enter the HTTPS version of your custom domain name. The message of "This Connection is Untrusted" is shown because we did not pay for a SSL certificate.

Select Add Exception.



Select Confirm Security Exception.

Now a secure lock is shown at the left of the URL.

This also works with PHP.

Reference:

Enable SSL for apache server in 5 minutes