Thanks to replay,
Either outStream or OutputStream, I have no idea which is genuine, and I think little import, cause my goal is to communicate with the Raspberry pi.
But when I try it,
Considering again that my goal is interacting with my Raspberry Pi via Wifi, and my RPi is waiting for my iOS app, in a socket server state, in my terminal :
pi@raspberrypi:~ $ python server.py
host = 172.20.10.12
By this python codes :
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()
When I click on ConnectNet button, Xcode only print :
NetworkEnable
But I'm wainting for it to print normally, (adapting my case states) :
NetworkEnabled
OpenCompleted
HasSpaceAvalable
And,
When I click on ButtoniPhone, I give an error in my RPi part :
socket.error: [Errno 32] Broken pipe
And a bug in my xcode :
(lldb)
Here is my entire ViewController.swift to verify :
import UIKit
class ViewController: UIViewController, StreamDelegate
{
@IBOutlet weak var label: UILabel!
@IBOutlet weak var labelConnection: UILabel!
let addr = "172.20.10.12"
let port = 9876
var inStream : InputStream?
var outStream: OutputStream?
var buffer = [UInt8](repeating: 0, count: 200)
@IBAction func ConnectNet(_ sender: Any)
{
NetworkEnable()
}
@IBAction func ButtoniPhone(_ sender: Any)
{
let data = "C'est le iPhone".data(using: .utf8)!
_ = data.withUnsafeBytes {bytes in
outStream?.write(bytes, maxLength: data.count)
}
func NetworkEnable()
{
print("NetworkEnable")
Stream.getStreamsToHost(withName: addr, port: port, inputStream: &inStream, outputStream: &outStream)
inStream?.delegate = self
outStream?.delegate = self
inStream?.schedule( in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
outStream?.schedule( in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
inStream?.open()
outStream?.open()
buffer = [UInt8](repeating: 0, count: 200)
}
func stream (aStream: Stream, handleEvent eventCode: Stream.Event)
{
switch eventCode
{
case Stream.Event.endEncountered:
print("EndEncountered")
labelConnection.text = "Connection arrêté par server"
inStream?.close()
inStream?.remove(from: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
outStream?.close()
print("Arrêt de outStream currentRunLoop")
outStream?.remove(from: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
case Stream.Event.errorOccurred:
print("ErrorOccurred")
inStream?.close()
inStream?.remove(from: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
outStream?.close()
outStream?.remove(from: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
labelConnection.text = "Ne peut pas connecter à server"
label.text = ""
case Stream.Event.hasBytesAvailable:
print("HasBytesAvailable")
if aStream == inStream
{
inStream!.read(&buffer, maxLength: buffer.count)
let bufferStr = NSString(bytes: &buffer, length: buffer.count, encoding: String.Encoding.utf8.rawValue)
label.text = bufferStr! as String
print(bufferStr!)
}
case Stream.Event.hasSpaceAvailable:
print("HasSpaceAvailable")
case Stream.Event.openCompleted:
print("OpenCompleted")
labelConnection.text = "Connecté à server"
default:
print("Inconnu")
}
}
override func didReceiveMemoryWarning()
{
super.didReceiveMemoryWarning()
}
override func viewDidLoad()
{
super.viewDidLoad()
}
}